#include "mylabel.h"
#include <QDebug>
#include <QMouseEvent>

myLabel::myLabel(QWidget *parent) : QLabel(parent)
{
    // 设置鼠标的追踪状态，默认为false
    // 含义：只要鼠标进入标签区域，不需要按下按钮，就会触发mouseMoveEvent事件
//    setMouseTracking(true);
}

void myLabel::enterEvent(QEvent *event)
{
    qDebug() << "鼠标进入了";
}

void myLabel::leaveEvent(QEvent *event)
{
    qDebug() << "鼠标离开了";
}

void myLabel::mousePressEvent(QMouseEvent *ev)
{
    // ev->x() ev->y() 是基于标签的，标签的左上角为 0,0
    // ev->globalX() ev->globalY() 是基于屏幕的，注意不是基于最外层窗体的

    // 鼠标左键时才触发
    if (ev->button() == Qt::LeftButton) {
        QString str = QString("鼠标按下了, x=%1, y=%2, globalX=%3, globalY=%4").arg(ev->x()).arg(ev->y()).arg(
                ev->globalX()).arg(ev->globalY());
        qDebug() << str;
    }
}

void myLabel::mouseReleaseEvent(QMouseEvent *ev)
{
    // 鼠标左键时才触发
    if (ev->button() == Qt::LeftButton) {
        QString str = QString("鼠标释放了, x=%1, y=%2, globalX=%3, globalY=%4").arg(ev->x()).arg(ev->y()).arg(
                ev->globalX()).arg(ev->globalY());
        qDebug() << str;
    }
}

void myLabel::mouseMoveEvent(QMouseEvent *ev)
{
    // 鼠标左键时才触发
//    if (ev->button() == Qt::LeftButton) {
    // 移动是一个状态，和按下和释放不同
    // 需要使用ev->buttons() 并且使用 & 来判断
    if (ev->buttons() & Qt::LeftButton) { // 如果设置事件追踪，应该把这个判断去掉。
        QString str = QString("鼠标移动了, x=%1, y=%2, globalX=%3, globalY=%4").arg(ev->x()).arg(ev->y()).arg(
                ev->globalX()).arg(ev->globalY());
        qDebug() << str;
    }
}

/**
 * 事件分发
 * @param e
 * @return false 向下分发事件，true 不向下分发事件
 */
bool myLabel::event(QEvent *e)
{
    // 如果是鼠标按下，在event事件分发中做拦截操作
    if (e->type() == QEvent::MouseButtonPress) {
        auto ev = dynamic_cast<QMouseEvent *>(e);    // 将父类指针转为子类指针
        QString str = QString("事件分发器中: 鼠标按下了, x=%1, y=%2, globalX=%3, globalY=%4").arg(ev->x()).arg(ev->y()).arg(
                ev->globalX()).arg(ev->globalY());
        qDebug() << str;
        return true;    //返回true表示用户自己处理了这个事件，不再向下分发事件
    }
    // 其他类型交给父类处理(默认处理)
    return QLabel::event(e);
}
